package pe.gob.osce.sirenas.dao.impl;


import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import pe.gob.osce.sirenas.dao.DomicilioDAOLocal;
import pe.gob.osce.sirenas.model.jpa.Comunicaciones;
import pe.gob.osce.sirenas.model.jpa.Domicilio;
import pe.gob.osce.sirenas.util.ConstanteEJB;
import pe.gob.osce.sirenas.util.ModeloException;

@Stateless
public class DomicilioDAOImpl implements DomicilioDAOLocal {

	@PersistenceContext(unitName="pe.gob.osce.sirenas.be.pu" )
	private	EntityManager	em;

	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteEJB.PROPERTIES);
	@Override
	public Domicilio insertar(Domicilio domicilio ) throws Exception {
		try{
			domicilio=em.merge(domicilio);
			em.flush();
			return domicilio;
		} catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}
	}

	@Override
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public Domicilio actualizar(Domicilio domicilio)throws Exception  {
    try{
            StringBuilder          jpql= new StringBuilder();
            
            jpql.append(" UPDATE Domicilio d ");
            jpql.append(" SET d.direccion = :direccion ");
            jpql.append(" ,d.referencias = :referencias ");
            jpql.append(" ,d.urbanizacion = :urbanizacion ");
            jpql.append(" ,d.centroPoblado = :centroPoblado ");
            jpql.append(" ,d.idRegion = :idRegion ");
            jpql.append(" ,d.idProvincia = :idProvincia ");
            jpql.append(" ,d.idDistrito = :idDistrito ");
            jpql.append(" ,d.idTipoZona = :idTipoZona ");
            jpql.append(" ,d.idTipoVia = :idTipoVia ");
            jpql.append(" ,d.codTramite = :codTramite ");
            jpql.append(" ,d.estado = :estado ");
            jpql.append(" WHERE d.idDomicilio = :idDomicilio ");
            
            Query        query= em.createQuery( jpql.toString() );
            
            query.setParameter("idDomicilio", domicilio.getIdDomicilio());
            query.setParameter("direccion", domicilio.getDireccion());
            query.setParameter("referencias", domicilio.getReferencias());
            query.setParameter("urbanizacion", domicilio.getUrbanizacion());
            query.setParameter("centroPoblado", domicilio.getCentroPoblado());
            query.setParameter("idRegion", domicilio.getIdRegion());
            query.setParameter("idProvincia", domicilio.getIdProvincia());
            query.setParameter("idDistrito", domicilio.getIdDistrito());
            query.setParameter("idTipoZona", domicilio.getIdTipoZona());
            query.setParameter("idTipoVia", domicilio.getIdTipoVia());
            query.setParameter("codTramite", domicilio.getCodTramite());
            
            query.setParameter("estado", domicilio.getEstado());
 
             query.executeUpdate();
            
		} catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}
            return domicilio;
    }
	
	
	@Override 
	public Domicilio consultarDomicilio(Long idDomicilio )
			throws Exception {
		Domicilio		domicilioJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT dom FROM Domicilio dom WHERE dom.idDomicilio= :idDomicilio AND dom.estado=1");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idDomicilio", idDomicilio);
			
			
			Domicilio  objetoJPA=(Domicilio)query.getSingleResult();
			domicilioJPA=objetoJPA;

		} catch (NoResultException nre) {
			domicilioJPA=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return domicilioJPA;
	}	

	@Override 
	public List<Domicilio> consultarHistorialDomicilio(Long idPersona )
			throws Exception {
		List<Domicilio>		listDomicilioJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT dom FROM Domicilio dom WHERE dom.idPersona= :idPersona AND dom.estado=0 ");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idPersona", idPersona);
			
			List<Domicilio>  listaObjetoJPA=query.getResultList();
			
			if(!listaObjetoJPA.isEmpty()) {
				listDomicilioJPA=new ArrayList<Domicilio>();
				for (Domicilio obj: listaObjetoJPA) {					
					listDomicilioJPA.add(obj);
				}				
			}
		} catch (NoResultException nre) {
			listDomicilioJPA=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listDomicilioJPA;
	}	
	

	
}
